package com.health.interceptor;

import com.health.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器
 */
@Component  //@Controller @Service @Mapper
@Slf4j
public class TokenInterceptor implements HandlerInterceptor {

    /**
     * 所有的请求都会先经过这里，如返回true则放行，继续运行Controller -> Service -> Mapper
     * 如果返回false，直接结束。
     *
     * @param request  请求对象
     * @param response 响应对象
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        //1. 获取请求头中的token
        String token = request.getHeader("token");

        //2. 使用工具类校验jwt令牌
        try {
            Claims map = JwtUtil.parseJwt(token);
            log.info("用户信息: {}", map);
        } catch (Exception e) {
            //说明令牌校验失败，抛出异常，被全局异常处理类处理
            //响应401状态码
            response.setStatus(401); //设置状态码401  表示未登录
            return false; //拦截，不再继续运行后续的三层结构
        }
        //3. 放行
        return true;
    }
}
